﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SegIdenPC.Entidad;
using SegIdenPC.Herramientas;
using log4net;
using GS1.Utilitario;
using System.Drawing.Imaging;
using System.Configuration;

namespace SegIdenPC.Formularios
{
    public partial class frmMantNivelTipoProducto : Form
    {
        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmMantNivelTipoProducto));

        private const string TITULO = "Mantenimiento de Nivel Tipo de Producto";
        private const string FORMATO_TOTAL_ENCONTRADOS = "Total encontrados: {0}";



        public enum OperacionMantenimiento
        {
            Nuevo,
            Editar
            
        }

        private OperacionMantenimiento tipoOperacionTipo = OperacionMantenimiento.Nuevo;

        private enum Opcion
        {
            Nuevo = 0, //1,
            Editar = 1, //2,
            Grabar = 2, // 3,
            Cancelar = 3 //4

        }
        public NivelProducto nivelProductoActual { get; set; }
        public NivelTipo nivelTipoActual { get; set; }
        private Nivel niveles = null;

        #endregion

        #region --- Constructor ---
        public frmMantNivelTipoProducto()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---

        private void frmMantNivelTipoProducto_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }
        private void tbtnSalir_Click(object sender, EventArgs e)
        {
            salir();
        }
        private void dgvListadoNivelTipoProducto_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
          seleccionarNivelProductoTipo();

        }

        private void tbtnGrabar_Click(object sender, EventArgs e)
        {
            grabar();
        }
         private void tbtnCancelar_Click(object sender, EventArgs e)
        {
           cancelar();
        }
         private void tbtnNuevo_Click(object sender, EventArgs e)
         {
             nuevo();
         }

         private void tbtnEditar_Click(object sender, EventArgs e)
         {
             editar();
         }
         private void cboNivelProductoTipo_SelectedIndexChanged(object sender, EventArgs e)
         {
            //seleccionNivelTipoProducto(string codigoProducto);
            seleccionNivelTipoProducto();
         }

        #endregion

        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            ListaGeneral listaEstadoNivelTipoProducto = null;
            try
            {
                Cursor.Current = Cursors.WaitCursor;

                 // Instanciando y creando listado de estado
                listaEstadoNivelTipoProducto = new ListaGeneral();
                listaEstadoNivelTipoProducto.Add(new General { codigo = Constantes.ESTADO_CODIGO_ACTIVO, descripcion = Constantes.ESTADO_DESCRIPCION_ACTIVO });
                listaEstadoNivelTipoProducto.Add(new General { codigo = Constantes.ESTADO_CODIGO_INACTIVO, descripcion = Constantes.ESTADO_DESCRIPCION_INACTIVO });

                // Estableciendo datos del combo Estado Nivel Producto
                this.cboEstadoNivelTipoProducto.DataSource = listaEstadoNivelTipoProducto;
                this.cboEstadoNivelTipoProducto.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboEstadoNivelTipoProducto.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboEstadoNivelTipoProducto.SelectedIndex = 0;

                // Ejecutar carga del combo Niveles
                cargarNiveles();
              
                // Estableciendo focus
                this.txtNombreNivelTipoProducto.Focus();
                
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void cargarNiveles()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_NIVELES;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de Nivel
            this.niveles = contenidoXML.DeserializarTo<Nivel>();

            // Estableciendo listado de nivel de producto AGREGA
            this.cboNivelProductoTipo.DataSource = this.niveles.listaNivelProducto.lista;
            this.cboNivelProductoTipo.ValueMember = Constantes.GENERAL_CODIGO;
            this.cboNivelProductoTipo.DisplayMember = Constantes.GENERAL_DESCRIPCION;
            this.cboNivelProductoTipo.SelectedIndex = 0;

            //ListaNivelProductoTipo
            ListaNivelProducto listaNivelProducto = new ListaNivelProducto();
            //agr
            //listaNivelProducto.add(new NivelProducto { codigo = Constantes.CODIGO_SELECCIONE, descripcion = Constantes.DESCRIPCION_SELECCIONE });

            foreach (NivelProducto nivelProducto in this.niveles.listaNivelProducto.lista)
            {
                listaNivelProducto.add(new NivelProducto { codigo = nivelProducto.codigo, descripcion = nivelProducto.descripcion });
            }

            // Estableciendo listado de nivel de producto
            this.cboNivelProductoTipo.DataSource = listaNivelProducto.lista;
            this.cboNivelProductoTipo.ValueMember = Constantes.GENERAL_CODIGO;
            this.cboNivelProductoTipo.DisplayMember = Constantes.GENERAL_DESCRIPCION;
            this.cboNivelProductoTipo.SelectedIndex = 0;

            // Se establece la fuente de datos de la grilla
            //this.dgvListadoNivelTipoProducto.DataSource = niveles.listaNivelTipo.lista == null ?
                                                        //  new ListPersonalizada<NivelTipo>() :
                                                       //   niveles.listaNivelTipo.lista;

            // Colorear grilla de acuerdo a criterios de Nivel Tipo Producto
            seleccionNivelTipoProducto(); // pintarGrillaNivelTipoProducto();

        }

        private void seleccionNivelTipoProducto()
        {
            string codigoNivelProductoTipo = string.Empty;

            //se obtiene el código de Producto de tipo a escoger
            if (this.cboNivelProductoTipo.SelectedValue is string)
            {
                codigoNivelProductoTipo = this.cboNivelProductoTipo.SelectedValue.ToString();
            }
            else
            {
                return;
                //codigoNivelProductoTipo = ((NivelTipo)this.cboNivelProductoTipo.SelectedValue).codigo;
            }

            //Se ordena la lista de todos los tipos obtenidos de la lista
            List<NivelTipo> listaNivelTipo = this.niveles.listaNivelTipo.lista;

            //Se separa unicamente los tipos asociados al nivel producto
            var listaTipo = from cust in listaNivelTipo
                            where cust.codNivelProducto == codigoNivelProductoTipo
                            select cust;

            // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
            this.dgvListadoNivelTipoProducto.AutoGenerateColumns = false;

            //se asocia el resultado con la grilla de datos
            this.dgvListadoNivelTipoProducto.DataSource = listaTipo.ToList<NivelTipo>();
           // this.dgvListadoNivelTipoProducto.DataSource = new ListPersonalizada<NivelTipo>();
            //niveles.listaNivelTipo.lista;      
       
            //se pinta de otro color en caso que haya uno inactivo
           for (int i = 0; i < listaTipo.ToList<NivelTipo>().Count; i++)
            {
                var NivelTipo = listaTipo.ToList<NivelTipo>()[i];

                NivelTipo.estado = NivelTipo.estado.Equals(Constantes.ESTADO_CODIGO_INACTIVO) ? Constantes.ESTADO_DESCRIPCION_INACTIVO : Constantes.ESTADO_DESCRIPCION_ACTIVO;

                if (NivelTipo.estado == Constantes.ESTADO_DESCRIPCION_INACTIVO)
                {
                    this.dgvListadoNivelTipoProducto.Rows[i].DefaultCellStyle.BackColor = Color.FromArgb(255, 128, 128);
                }
            }
}
        

        private void seleccionarNivelProductoTipo()
        {
            this.grpComponentes.Enabled = false;
            // Valida si seleccione algun contactocliente
            if (this.dgvListadoNivelTipoProducto.CurrentRow != null && this.dgvListadoNivelTipoProducto.CurrentRow.Index > -1)
            {
                // Obteniendo lista de contactos
                List<NivelTipo> listaNivelTipo = (List<NivelTipo>)this.dgvListadoNivelTipoProducto.DataSource;
               // NivelTipo nivelTipoActual = new NivelTipo();
                nivelTipoActual = listaNivelTipo[this.dgvListadoNivelTipoProducto.CurrentRow.Index];

                //Cargar datos
                this.txtNombreNivelTipoProducto.Text = dgvListadoNivelTipoProducto.CurrentRow.Cells[0].Value.ToString();
                this.txtNombreNivelTipoProducto.Text = nivelTipoActual.descripcion;
                this.cboEstadoNivelTipoProducto.Text = nivelTipoActual.estado;
            }
        }

        private void nuevo()
        {
            this.grpComponentes.Enabled = true;
            this.cboEstadoNivelTipoProducto.Enabled = false;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Nuevo);

            // Limpiar los datos del formulario
            limpiarTodo();

            this.tipoOperacionTipo = OperacionMantenimiento.Nuevo;

            // Estableciendo focus al combo tipo documento
            this.txtNombreNivelTipoProducto.Focus();
        }

        private void editar()
        {
            this.grpComponentes.Enabled = true;
      
           this.cboEstadoNivelTipoProducto.Enabled = true;

            // Estableciendo los estados de los botones
           cambiarEstadoBotones(Opcion.Editar);

           this.tipoOperacionTipo = OperacionMantenimiento.Editar;

            // Estableciendo focus al combo tipo documento
           this.txtNombreNivelTipoProducto.Focus();
        }


        private void limpiarTodo()
        {
            this.txtNombreNivelTipoProducto.Text = string.Empty;
            this.cboEstadoNivelTipoProducto.Text = Constantes.ESTADO_DESCRIPCION_ACTIVO;
        }


    /*    private void finalizarFormulario()
        {
            this.tabControl.Selecting -= new TabControlCancelEventHandler(tabControl_Selecting);
        }*/

        private void salir()
        {
            this.Close();
        }

    
        private bool validarTipoRepetido(string NombreNivelTipo)
        {
            bool resultado = false;

            // Obteniendo lista de NivelProducto
             ListPersonalizada<NivelTipo> listaNivelTipo = (ListPersonalizada<NivelTipo>)this.dgvListadoNivelTipoProducto.DataSource;
            if (listaNivelTipo != null)
            {
                foreach (NivelTipo item in listaNivelTipo)
                {
                    if (item.descripcion.Equals(NombreNivelTipo))
                    {
                        resultado = true;
                        break;
                    }
                }
            }

            return resultado;
        }

        private bool validarEntradaTipo()
        {
          bool resultado = false;

          this.txtNombreNivelTipoProducto.Text = this.txtNombreNivelTipoProducto.Text.Trim();

          if (this.txtNombreNivelTipoProducto.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtNombreNivelTipoProducto, "Debe ingresar el campo Nombre Nivel de Producto", TITULO);
                return true;
            }
            return resultado;
          
        }

        private void limpiarNivelTipo()
        {
            this.txtNombreNivelTipoProducto.Text = string.Empty;
            this.cboEstadoNivelTipoProducto.Text = Constantes.ESTADO_CODIGO_ACTIVO;
        }

       private void grabar()
              {
                   Operacion operacion = null;
                   string contenidoXML = string.Empty;

                   try
                   {
                       if (validarEntradaTipo()) { return; }

                       // Solicitar confirmacion
                       if (!Libreria.ShowMessageboxPregunta((this.tipoOperacionTipo == OperacionMantenimiento.Nuevo ?
                                                                                   "¿Estas seguro de registrar el Nivel de Tipo?" :
                                                                                   "¿Estas seguro de modificar el Nivel de Tipo Actual?"), TITULO)) { return; }

                       // Estableciendo operacion a ser enviada al Servicio REST
                       operacion = new Operacion();
                       operacion.numero = this.tipoOperacionTipo == OperacionMantenimiento.Nuevo ? Constantes.OPERACION_REGISTRAR_NIVEL_TIPO : Constantes.OPERACION_MODIFICAR_NIVEL_TIPO;

                       operacion.nivelTipo = new NivelTipo();
                       operacion.nivelTipo.codigo = this.tipoOperacionTipo == OperacionMantenimiento.Nuevo ? Constantes.VALOR_CERO : this.nivelTipoActual.codigo;
                       operacion.nivelTipo.codNivelProducto = this.cboNivelProductoTipo.SelectedValue.ToString(); // Convert.ToInt32
                       operacion.nivelTipo.descripcion = this.txtNombreNivelTipoProducto.Text;
                       operacion.nivelTipo.estado = this.cboEstadoNivelTipoProducto.SelectedValue.ToString();
                       operacion.nivelTipo.fechaRegistro = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);
   

                       // Instanciando y ejecutando llamada al ServicioREST
                       ConexionREST conexionREST = new ConexionREST();
                       contenidoXML = conexionREST.ejecutarOperacion(operacion);

                       // Obteniendo Objeto de Error
                       OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                       // Validar si hay error
                       if (operacionError != null)
                       {
                           Libreria.ShowMessageboxError(operacionError.descripcion);
                           return;
                       }

                       OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                       string mensajeOK = this.tipoOperacionTipo == OperacionMantenimiento.Nuevo ? "Registro guardado correctamente" : "Datos modificado correctamente";
                       string mensajeError = this.tipoOperacionTipo == OperacionMantenimiento.Nuevo ? "No se guardo los datos" : "No se actualizo los datos";

                       if ((operacionResultado != null) &&
                       (operacionResultado.esOK.Equals(Constantes.SI)))
                       {
                           Libreria.ShowMessageboxInfo(mensajeOK, TITULO);
                       }
                       else
                       {
                           Libreria.ShowMessageboxError(mensajeError, TITULO);
                           return;
                       }

                       cargarNiveles();
                       limpiarTodo();
                       cambiarEstadoBotones(Opcion.Grabar);
                      
                   }
                   catch (Exception ex)
                   {
                       log.Error(ex.Message, ex);
                       Libreria.MensajeError(ex, TITULO);
                   }
                 
               }


            private void cancelar()
           {
               if ((this.tipoOperacionTipo == OperacionMantenimiento.Editar) ||
                (!this.grpComponentes.Enabled))
           {
               this.cboEstadoNivelTipoProducto.Text = this.txtNombreNivelTipoProducto.Text;
               this.txtNombreNivelTipoProducto.Text = this.txtNombreNivelTipoProducto.Text;
           }

           if (!this.txtNombreNivelTipoProducto.Text.Equals(string.Empty))
           {
               // Refrescar grilla
              cargarNiveles();
           }

           // Deshabilitando el grupoBox de datos
           this.grpComponentes.Enabled = false;

           // Estableciendo los estados de los botones
           cambiarEstadoBotones(Opcion.Cancelar);

           // Estableciendo focus al caja de texto de busqueda
           this.txtNombreNivelTipoProducto.Focus();
           }

        private void cambiarEstadoBotones(Opcion tipoOperacion)
        {
            switch (tipoOperacion)
            {

                case Opcion.Nuevo:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnEditar.Enabled = false;

                    break;
                case Opcion.Editar:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnNuevo.Enabled = false;

                    break;
                case Opcion.Grabar:
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnEditar.Enabled = true;
                    this.tbtnGrabar.Enabled = false;

                    break;
                case Opcion.Cancelar:
                    this.tbtnNuevo.Enabled = true;           
                    this.tbtnCancelar.Enabled = false;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = true;
               
                    break;
                           }
        }
        #endregion
    }
}